#ifndef DESCRIPTIONFICHIER_HPP
#define DESCRIPTIONFICHIER_HPP

#include <QtCore/QObject>

#include <QtCore/QSet>
#include <QtCore/QHash>
#include <QtCore/QString>
#include <QtCore/QStringList>

/** Classe qui permet de traiter la description du contenu d'un fichier XML.
  * Une instance de \c DescriptionFichier lit un fichier XML qui contient la
  * liste des balises et attributs devant être extraite d'un fichier XML
  * téléchargé depuis l'API de croquemonster.
  *
  * @author Johan "Solo" Luisier
  * @date Octobre 2011
  */
class DescriptionFichier : public QObject
{
  Q_OBJECT
public:
    /** Constructeur standard.
      *
      * @param[in] nomFichier nom du fichier à charger.
      * @param[in] parent pointeur sur le parent.
      */
  DescriptionFichier( const QString& nomFichier,
                      QObject * parent = 0 );
  /** Le destructeur n'a rien de spécial à faire.
    */
  virtual ~DescriptionFichier();
  /** Permet de lire le fichier et initiliser la structure interne.
    * L'exécution est stoppée si le fichier de description ne peut pas être lu,
    * si l'arbre DOM ne peut être chargé, si le nom d'un élément DOM ou d'un
    * attribut manque (erreur dans la syntaxe du fichier XML lu).
    *
    * @return un code d'erreur, ou 0 si tout s'est bien déroulé.
    */
  unsigned chargerDescription();
  /** Permet d'accéder au membre InitialisationEffectuee.
    *
    * @return une référence constante sur InitialisationEffectuee.
    */
  const bool& initialisationEffectuee() const;
  /** Réalise un affichage de la structure de donnée interne.
    * Cette méthode est utilisée pour des fins de débugging uniquement.
    */
  void affichageCompletContenu() const;
  /** Permet d'accéder au membre ListeBalises.
    *
    * @return une référence constante sur ListeBalises.
    */
  const QSet< QString >* listeBalises() const;
  /** Permet d'accéder au membre ListeAttributs.
    *
    * @return une référence constante sur ListeAttributs.
    */
  const QHash< QString, QStringList >* listeAttributs() const;
protected:
  /** Le membre InitialisationEffectuee contient \e true une fois que la
    * structure de donnée interne a pu être correctement chargée et empêche
    * ainsi qu'un appel à chargerDescription lance une nouvelle lecture du
    * fichier.
    */
  bool InitialisationEffectuee;
  /** Nom du fichier XML lu, duquel est extraite la structure du fichier
    * téléchargé depuis l'API croquemonster.
    */
  QString NomFichierDescriptif;
  /** Liste des balises qui seront extraites des fichier fournis par l'API
    * croquemonster. Les balises non présentes dans cette liste seront ignorées
    * lors de la lecture.
    */
  QSet< QString > ListeBalises;
  /** Liste des attributs de chaque balise qui seront extrait des fichiers
    * fournis par l'API croquemonster. La clé du conteneur est le nom de la
    * balise, la valeur est une liste des noms d'attributs. A nouveau, les
    * attributs non cités dans ce membre ne seront ignorés lors de la lecture.
    */
  QHash< QString, QStringList > ListeAttributs;
};

#endif // DESCRIPTIONFICHIER_HPP
